home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / dev / gcc / ixemul_src.lha / ixemul-41.0 / library / __read.c < prev    next >
C/C++ Source or Header  |  1995-05-28  |  3KB  |  98 lines

  1. /*
  2.  *  This file is part of ixemul.library for the Amiga.
  3.  *  Copyright (C) 1991, 1992  Markus M. Wild
  4.  *
  5.  *  This library is free software; you can redistribute it and/or
  6.  *  modify it under the terms of the GNU Library General Public
  7.  *  License as published by the Free Software Foundation; either
  8.  *  version 2 of the License, or (at your option) any later version.
  9.  *
  10.  *  This library is distributed in the hope that it will be useful,
  11.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  13.  *  Library General Public License for more details.
  14.  *
  15.  *  You should have received a copy of the GNU Library General Public
  16.  *  License along with this library; if not, write to the Free
  17.  *  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  18.  *
  19.  *  __read.c,v 1.1.1.1 1994/04/04 04:30:12 amiga Exp
  20.  *
  21.  *  __read.c,v
  22.  * Revision 1.1.1.1  1994/04/04  04:30:12  amiga
  23.  * Initial CVS check in.
  24.  *
  25.  *  Revision 1.1  1992/05/14  19:55:40  mwild
  26.  *  Initial revision
  27.  *
  28.  */
  29.  
  30. #define KERNEL
  31. #include "ixemul.h"
  32. #include "kprintf.h"
  33.  
  34. int
  35. __read(struct file *f, char *buf, int len)
  36. {
  37.   int err=errno, res = 0;
  38.   int omask;
  39.  
  40.   /* always return EOF */
  41.   if (HANDLER_NIL(f)) return 0;
  42.  
  43.   omask = syscall (SYS_sigsetmask, ~0);
  44.   __get_file (f);
  45.   /* just to make sure, this packet is really free, it could have
  46.    * been used by a semi-async write, eg. */
  47.   __wait_packet(&f->f_sp);
  48.  
  49.   if (len > 0)
  50.     {
  51.       if (f->f_flags & FNDELAY)
  52.     {
  53.       /* shudder.. this is the most inefficient part of the whole
  54.        * library, but I don't know of another way of doing it... */
  55.       while (res < len)
  56.             {
  57.               SendPacket1(f, __rwport, ACTION_WAIT_CHAR, 10);
  58.               __wait_packet(&f->f_sp);
  59.               if (! LastResult(f))
  60.               {
  61.                 if (!res)
  62.                 {
  63.                   res = -1;
  64.                   err = EAGAIN;
  65.                 }
  66.                 break;
  67.               }
  68.           SendPacket3(f,__rwport,ACTION_READ,f->f_fh->fh_Arg1,(long)buf,1);
  69.           __wait_packet(&f->f_sp);
  70.           if (LastResult(f) != 1) 
  71.         {
  72.           err = __ioerr_to_errno(LastError(f));
  73.           /* if there really was no character to read, we should
  74.            * have escaped already at the 'if WaitForChar' line */
  75.           res = -1;
  76.           break;
  77.         }
  78.           buf++;
  79.           res++;
  80.         }
  81.     }      
  82.       else
  83.     {
  84.       SendPacket3(f,__rwport,ACTION_READ,f->f_fh->fh_Arg1,(long)buf,len);
  85.       __wait_packet(&f->f_sp);
  86.       res = LastResult(f);
  87.       if (res == -1) err = __ioerr_to_errno(LastError(f));
  88.     }
  89.    }
  90.  
  91.   LastResult(f) = 0;
  92.   __release_file (f);
  93.   syscall (SYS_sigsetmask, omask);
  94.   errno = err;
  95.   KPRINTF (("&errno = %lx, errno = %ld\n", &errno, errno));
  96.   return res;
  97. }
  98.